#include "stm32f10x.h"                  // Device header


//******************************************引脚配置层***********************************************************************
/*
SCK引脚电平设置
*/
void MySPI_SCK_W(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue);
}


/*
SS引脚电平设置
*/
void MySPI_SS_W(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue);
}


/*
MOSI引脚电平设置
*/
void MySPI_MOSI_W(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)BitValue);
}

/*
读MISO引脚数据
*/
uint8_t MySPI_MISO_R(void)
{
	return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
}

/*
SPI初始化函数
*/
void MySPI_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		
	// SS SCK MOSI : 推挽输出
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	// MISO : 上拉输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);						
	// 选择模式0
	MySPI_SS_W(1);
	MySPI_SCK_W(0);
}


//*********************************************(通信层)时序单元层***********************************************************************

/*
SPI起始信号
*/
void MySPI_Start(void)
{
	MySPI_SS_W(0);
}

/*
SPI终止信号
*/
void MySPI_Stop(void)
{
	MySPI_SS_W(1);
}


/*
SPI交换字节
*/
uint8_t MySPI_Swap_ByteSend(uint8_t ByteSend)
{
	uint8_t i;
	uint8_t ByteReceive = 0x00;
	for (i = 0; i < 8; i ++)
	{
		MySPI_MOSI_W(ByteSend & (0x80 >> i));
		MySPI_SCK_W(1);
		if (MySPI_MISO_R() == 1) {ByteReceive |= (0x80 >> i);};
		MySPI_SCK_W(0);
	}
	
	return ByteReceive;
}
